#include "history.h"
#include "ui_history.h"
#include <QVector>
#include <QTimer>
#include <QTime>

history::history(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::history)
{
    ui->setupUi(this);

    //绘图初始化
    setupRealtimeDataDemo(ui->customPlot);
    //告诉绘图控件重新绘制其内容。这通常在数据更新或需要刷新视图时调用。
    ui->customPlot->replot();

    // 连接历史数据槽函数
    connect(ui->push_his,SIGNAL(clicked()),this,SLOT(Push_his_Slot()));


}

history::~history()
{
    delete ui;
}

// 点击查询按钮发送查询历史数据指令
void history::Push_his_Slot()
{

    // 获取日期时间
    time_start = ui->time_start->dateTime();
    time_stop = ui->time_stop->dateTime();
    qDebug() << "获取了时间";

    // 打印日期文本
    qDebug() << "Time start:" << time_start;
    qDebug() << "Time stop:" << time_stop;

    // 将日期和时间转换为UTC+8时间戳
    qint64 timestamp_start = time_start.toTime_t();
    qint64 timestamp_stop = time_stop.toTime_t();

    qDebug() << "Time start stamp:" << timestamp_start;
    qDebug() << "Time stop stamp:" << timestamp_stop;

    // 创建根对象
    QJsonObject rootObject;

    QJsonObject hisObject;
    hisObject["startime"] = timestamp_start;
    hisObject["stoptime"] = timestamp_stop;

    // 将报告对象添加到根对象
    rootObject["historydata"] = hisObject;

    // 将JSON对象序列化为文档
    QJsonDocument hisjsonDoc(rootObject);

    // 将文档转换为字符串（QByteArray）
    QByteArray jsonString = hisjsonDoc.toJson(QJsonDocument::Compact);

    qDebug() << jsonString ;

    // mqtt发布控制数据
    QMQTT::Message message;
    message.setTopic(GlobalVal::topic);
    message.setPayload(jsonString);
    quint16 result = GlobalVal::mqtt->publish(message);
    if (result == 0)
    {
        qDebug() << "his Message published successfully.";
    }
    else
    {
         qDebug() << "his Failed to publish message. Error code:" << result;
    }

}



//画图初始化
void history::setupRealtimeDataDemo(QCustomPlot *customPlot)
{


    // 初始化转速曲线
    // 添加了一个新的数据图线（graph），并将这条线设为蓝色。
    customPlot->addGraph(); // blue line
    customPlot->graph(0)->setPen(QPen(Qt::blue));  // 索引为0的图线的颜色为蓝色。
    customPlot->graph(0)->setName("转速");

    // 初始化温度曲线
    // 添加了一个新的数据图线（graph），并将这条线设为红色。
    customPlot->addGraph();
    customPlot->graph(1)->setPen(QPen(Qt::red));  // 索引为1的图线的颜色为红色。
    customPlot->graph(1)->setName("温度");


    //配置x轴
    customPlot->xAxis->setTickLabelRotation(35);      // x轴偏移35度
    customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);  // 设置x轴刻度标签为日期时间类型
    customPlot->xAxis->setDateTimeFormat("hh:mm:ss");   // 设置x轴时间格式为时分秒
    customPlot->xAxis->setAutoTickStep(true);  // 关闭自动刻度步长功能


    //配置左y轴 温度y轴
    customPlot->yAxis->setTickLabelType(QCPAxis::ltNumber);  // 设置刻度标签类型为数字
    customPlot->yAxis->setNumberFormat("%2.2f");  // 设置数字格式，f 表示浮点数，2 表示小数点后两位
    customPlot->yAxis->setAutoTickStep(false);  // 关闭自动刻度步长功能
    customPlot->yAxis->setTickStep(200);  // 设置刻度步长为200
    customPlot->yAxis->setRange(0, 2000);    // 调整 y 轴的范围


    // 添加右侧 y 轴
    QCPAxisRect *axisRect = customPlot->axisRect();
    QCPAxis *yAxis2 = axisRect->addAxis(QCPAxis::atRight);
    yAxis2->setTickLabelType(QCPAxis::ltNumber);  // 设置刻度标签类型为数字
    yAxis2->setNumberFormat("%d");  // 设置数字格式为整数
    yAxis2->setAutoTickStep(false);  // 关闭自动刻度步长功能
    yAxis2->setTickStep(1000);  // 设置刻度步长为500
    yAxis2->setRange(0, 12000);    // 调整 y 轴的范围


    customPlot->graph(1)->setValueAxis(customPlot->yAxis);  // 温度曲线绑定左侧y轴
    customPlot->graph(0)->setValueAxis(yAxis2); // 转速曲线绑定右侧y轴


    customPlot->axisRect()->setupFullAxesBox();  // 配置了图表的轴矩形，使其显示完整的轴框
    customPlot->legend->setVisible(true);  // 设置了图例为可见，图例中包含了图表中所有图线的名称。

    // 重绘图表
    customPlot->replot();

    // 显示图表
    customPlot->show();
}



void history::hisSlot(QByteArray msg)
{
    qDebug() << "开始向图表中写入历史数据" ;

    QVector<double> x;
    QVector<double> speedval;
    QVector<double> temperatureval;

    // 在这里打印一下json数据
    qDebug() << msg;

    QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(msg, &jsonError);  // 转化为 JSON 文档
    QJsonObject object = doucment.object();  // 获取根对象

    QJsonArray timeDataArray = object["timeData"].toArray();  // 获取timeData数组

    //遍历json数组
    for(const QJsonValue &value : timeDataArray)
    {
        QJsonObject timeDataObj = value.toObject();
        // 获取time、temperature、speed的值

        QString time = timeDataObj["time"].toString();
        QString temperature = timeDataObj["temperature"].toString();
        QString speed = timeDataObj["speed"].toString();

        // 添加数据到向量中
        x.append(time.toDouble());
        speedval.append(speed.toDouble());
        temperatureval.append(temperature.toDouble());

        qDebug() << "time:" << time << " speed:" << speed << "temperature:" << temperature;

    }

    // 设置图表数据
    ui->customPlot->graph(0)->setData(x, speedval);
    ui->customPlot->graph(1)->setData(x, temperatureval);

    //设置x轴范围
    ui->customPlot->xAxis->setRange(x.first(), x.last());

    ui->customPlot->replot();  // 重绘图表

}


